#-*-coding:utf-8-*-
from ctypes import *
#首先这个python读取dll使用一个库，这个库叫做ctypes，然后这个库可以读windows的dll
#也可以读linux的so，不过需要注意的是不同的调用栈方式会导致使用的函数不同
#如果是__stdcall的调用栈修饰方式则要使用ctypes.windll.LoadLibrary
#如果是__cdecl的调用栈修饰方式则要使用ctypes.cdll.LoadLibrary
#一般来说linux下默认都是__cdecl的调用栈的方式
my_lib_so = cdll.LoadLibrary("./testlib.so");
my_lib_so.say_hello()
a = my_lib_so.my_max_int(3,4)
my_max_float = my_lib_so.my_max_float
my_max_float.argtypes = [c_float,c_float]
my_max_float.restype = c_float
print "int max : ",a
print "float max : ",my_max_float(3.3,5.6)
my_max_double = my_lib_so.my_max_double
my_max_double.argtypes = [c_double,c_double]
my_max_double.restype = c_double
print "double max : ",my_max_double(5.9,6.5478)
#传递指针（或者使用引用传递参数）
#有时候C函数期望一个数据类型的指针作为参数，可能写入到相对位置，
#或者如果数据太大以至于不能通过值来进行传递。对于传递引用来说也是一样的。
#ctypes导出一个byref()功能用于使用引用传递参数。
#同样也可以使用pointer功能到达效果，但是pointer()做了许多工作在它构造一个实际的指针对象，
#所以用byref会快些如果你不需要指针对象在python中
s = "HelloWorld"
direct_select_sort = my_lib_so.direct_select_sort
direct_select_sort.argtypes = [c_char_p,c_int]
direct_select_sort(s,len(s))
print "s = ",s

return_string_buf = my_lib_so.return_string_buf
return_string_buf.restype = c_char_p;
ss = return_string_buf()
print "ss = ",ss

a = [2,5,8,7,3,21,51,12,3,4,6]
integers_array = c_int * len(a)
ii = integers_array(2,5,8,7,3,21,51,12,3,4,6)
shell_sort = my_lib_so.shell_sort
shell_sort.argtypes = [integers_array,c_int]
shell_sort(ii,len(a))
print "array:"
for i in ii :
	print i,
print " "
class StuInfoStruct(Structure):
	_fields_ = [("id",c_char * 16),
				("name",c_char_p),
				("name_len",c_uint),
				("age",c_int),
				("is_sleep_in_school",c_bool),
				("reverse",c_ubyte)]
stu = StuInfoStruct()
get_stu_info = my_lib_so.get_stu_info
get_stu_info.restype = c_bool
res = get_stu_info(byref(stu))
print "stu.id : ",stu.id
print "stu.name : ",stu.name
print "stu.name_len : ",stu.name_len
print "stu.age : ",stu.age
print "stu.is_sleep_in_school : ",stu.is_sleep_in_school

#这段代码本来想尝试二级指针，但是都已失败告终，发出来顺便求解。
#ppubyte = POINTER(POINTER(c_ubyte))
#pubyte = POINTER(c_ubyte)
#pint = POINTER(c_int)
#arr = pubyte()
#a_len = c_int()
#return_memery_buf = my_lib_so.return_memery_buf
#return_memery_buf.argtypes = [ppubyte,pint]
#return_memery_buf(byref(arr),byref(a_len))
#print "len : ",a_len," array: ",arr

#print "get arr 0 : ",arr.contents

